import {Content, Loading, LoadingController, NavController, Platform, Toast, ToastController,AlertController} from "ionic-angular";

import {Log} from "../framework/utils/Log";

/**
 * Created by lijing on 2018/8/15.
 */
export abstract class BasePage {
    /**
     * 是否显示生命周期方法回调的Log开关，每次都输出生命周期方法log不方便log分析，固而加此开关。
     * @type {boolean}  true-输出生命周期回法回调Log,  false-不输出生命周期回法回调Log
     * @private
     */
    private _isShowLifeCycle: boolean = false;

    /** 方便界面Loading统一管理 */
    public loading: Loading;
    private pageType: string;
    private fn: Function;
    private toast: Toast = null;

    /** 构造函数 */
    constructor(
                public platform: Platform,
                public loadingCtrl: LoadingController,
                public toastCtrl: ToastController,
                public alertCtrl: AlertController) {
    }

    protected getClassName():string{
        return "BasePage";
    }

    /**
     * 当页面加载的时候触发，仅在页面创建的时候触发一次
     * 如果被缓存了，那么下次再打开这个页面则不会触发
     */
    ionViewDidLoad() {
        if (this._isShowLifeCycle) {
            Log.d("BasePage" + this.constructor.name, "-------------- ionViewDidLoad --------------");
        }
    }

    /**
     * 即将进入一个页面变成当前激活页面的时候执行的事件
     */
    ionViewWillEnter() {
        if (this._isShowLifeCycle) {
            Log.d("BasePage-" + this.constructor.name, "-------------- ionViewWillEnter --------------");
        }
    }

    /**
     * 进入了一个页面且变成了当前的激活页面
     * 该事件不管是第一次进入还是缓存后进入都将执行
     */
    ionViewDidEnter() {
        if (this._isShowLifeCycle) {
            Log.d("BasePage-" + this.constructor.name, "-------------- ionViewDidEnter --------------");
        }
    }

    /**
     * 将要离开了该页面之后变成了不是当前激活页面的时候执行的事件
     */
    ionViewWillLeave() {
        if (this._isShowLifeCycle) {
            Log.d("BasePage-" + this.constructor.name, "-------------- ionViewWillLeave --------------");
        }
    }

    /**
     * 在页面完成了离开该页面并变成了不是当前激活页面的时候执行的事件
     */
    ionViewDidLeave() {
        if (this._isShowLifeCycle) {
            Log.d("BasePage-" + this.constructor.name, "-------------- ionViewDidLeave --------------");
        }
    }

    /**
     * 在页面销毁和页面中有元素移除之前执行的事件
     */
    ionViewWillUnload() {
        if (this._isShowLifeCycle) {
            Log.d("BasePage-" + this.constructor.name, "-------------- ionViewWillUnload --------------");
        }
    }

    /**
     * 在页面销毁和页面中有元素移除之后执行的事件
     */
    ionViewDidUnload() {
        if (this._isShowLifeCycle) {
            Log.d("BasePage-" + this.constructor.name, "-------------- ionViewDidUnload --------------");
        }
    }

    //////////////////////////////////////
    // angular 生命周期
    //////////////////////////////////////

    /**
     * 当被绑定的输入属性的值发生变化时调用，首次调用一定会发生在 ngOnInit之前。
     * @param changeRecord
     */
    ngOnChanges(changeRecord) {
        if (this._isShowLifeCycle) {
            Log.d("BasePage-" + this.constructor.name, "************** ngOnChanges **************");
        }
    }

    /**
     * 在第一轮 ngOnChanges 完成之后调用。
     * 也就是说当每个输入属性的值都被触发了一次 ngOnChanges 之后才会调用 ngOnInit ，此时所有输入属性都已经有了正确的初始绑定值
     */
    ngOnInit() {
        if (this._isShowLifeCycle) {
            Log.d("BasePage-" + this.constructor.name, "************** ngOnInit **************");
        }
        //this.content.resize();
    }

    /**
     * 在每个 Angular 变更检测周期中调用
     */
    ngDoCheck() {
        if (this._isShowLifeCycle) {
            Log.d("BasePage-" + this.constructor.name, "************** ngDoCheck **************");
        }
    }

    /**
     * 当把内容投影进组件之后调用。
     */
    ngAfterContentInit() {
        if (this._isShowLifeCycle) {
            Log.d("BasePage-" + this.constructor.name, "************** ngAfterContentInit **************");
        }
        // this.content.resize();
    }

    /**
     * 每次完成被投影组件内容的变更检测之后调用
     */
    ngAfterContentChecked() {
        if (this._isShowLifeCycle) {
            Log.d("BasePage-" + this.constructor.name, "************** ngAfterContentChecked **************");
        }
    }

    /**
     * 初始化完组件视图及其子视图之后调用
     */
    ngAfterViewInit() {
        if (this._isShowLifeCycle) {
            Log.d("BasePage-" + this.constructor.name, "************** ngAfterViewInit **************");
        }
    }

    /**
     * 每次做完组件视图和子视图的变更检测之后调用
     */
    ngAfterViewChecked() {
        if (this._isShowLifeCycle) {
            Log.d("BasePage-" + this.constructor.name, "************** ngAfterViewChecked **************");
        }
    }

    /**
     * 当 Angular 每次销毁 指令/组件 之前调用
     */
    ngOnDestroy() {
        if (this._isShowLifeCycle) {
            Log.d("BasePage-" + this.constructor.name, "************** ngOnDestroy **************");
        }
    }

    set isShowLifeCycle(value: boolean) {
        this._isShowLifeCycle = value;
    }

    /**
     * 显示或取消Loading加载框
     * @param {boolean} showLoadingUI true-显示加载框，false-隐藏加载框
     */
    protected showLoading(showLoadingUI: boolean, text: string) {
        console.log("BasePage", "showLoading: showLoadingUI= " + showLoadingUI + "    " +this.constructor.name);

        if (showLoadingUI) {
            if (!this.loading) {
                this.fn = this.platform.registerBackButtonAction(()=>{
                    Log.d("BasePage", "showLoading  拦截 返回键");
                },101);
                this.loading = this.loadingCtrl.create({
                    spinner: "ios",
                    content: text
                });
                Log.d("BasePage", "showLoading: show");

                this.loading.present().catch((err)=>{
                    Log.d("BasePage", "showLoading: err");

                });
            }
        } else {
            if(this.fn){
                Log.d("BasePage", "showLoading  取消拦截 返回键");
                this.fn();
                this.fn = null;
            }
            if (this.loading) {
                Log.d("BasePage", "showLoading: dismiss");
                this.loading.dismiss().catch((err)=>{
                    Log.d("BasePage", "showLoading: err");

                });
                this.loading = null;
            }
        }
    }

    /** 显示Error信息 */
    protected showError(message: string) {
        this.showToast(message);
    }

    /** 显示toast信息 */
    protected showToast(message: string) {
        if (this.toast) {
            this.toast.dismissAll();
            this.toast = null;
        }
        this.toast = this.toastCtrl.create({
            message: message,
            duration: 700,
            position: 'middle',
            cssClass: 'base-toast'
        });
        this.toast.present();
    }
    /** 显示alertController信息 */
    protected presentAlert(title:string,context:string) {
        let alert = this.alertCtrl.create({
            title: title,
            subTitle: context,
            buttons: ['确定']
        });
        alert.present();
    }
    protected getCurrentPageType(): string {
        return this.pageType;
    }

    /** 切换界面type需要时重写 */
    protected switchPageType(type: string) {
        this.pageType = type;
    }

}
